package com.cloud.jvm.ref;

import java.lang.ref.SoftReference;

/**
 * @version v1.0
 * @author: TianXiang
 * @description: 软引用-对象包装了一层
 * @date: 2021/5/31
 */
public class SoftRef {

    public static void main(String[] args) {
        memoryEnough();
         System.out.println("==========================================================");
        memoryNotEnough();
    }

    /**
     * 内存够用, 不回收被引用的对象
     */
    public static void memoryEnough() {
        // 强行引用对象-强引用
        Object o1 = new Object();
        SoftReference<Object> softRef = new SoftReference<>(o1);

        o1 = null;
        System.gc();

        System.out.println(o1);// null
        System.out.println(softRef.get());// java.lang.Object@2957fcb0
    }

    /**
     * JVM配置: 故意产生大对象且配置小内存, 导致内存不够, 再查看软引用对象的回收情况
     *      JVM参数: -Xms5m -Xmx5m
     * 内存不够用, 回收被引用的对象
     */
    public static void memoryNotEnough() {
        // 强行引用对象-强引用
        Object o1 = new Object();
        SoftReference<Object> softRef = new SoftReference<>(o1);

        o1 = null;

        // 创建一个30M的数组
        try {
            byte[] bytes = new byte[30 * 1024 * 1024];
        } catch (Exception e) {

        }finally {
            System.out.println(o1);// null
            System.out.println(softRef.get());// null
        }

    }

}
